package com.mashibing.juc.c_003;

import java.util.concurrent.TimeUnit;

/**
 * @ClassName T02
 * @Description 锁定某对象o, 如果o的属性发生改变，不影响锁的使用
 * 但是如果o变成了另外一个对象，则锁定的对象发生改变
 * 应该避免将锁定对象的引用 变成另外的对象
 * @Author xiongwei.wu
 * @Date 2021/7/1 11:29
 **/
public class T02 {
    /*final*/ Object o = new Object();

    void m() {
        synchronized (o) {
            while (true) {
                try {
                    TimeUnit.SECONDS.sleep(1);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(Thread.currentThread().getName());
            }
        }
    }

    public static void main(String[] args) {
        T02 t = new T02();
        new Thread(t::m, "t1").start();

        try {
            TimeUnit.SECONDS.sleep(3);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        Thread t2 = new Thread(t::m, "t2");
        //锁对象如果发送改变，所以t2线程被执行，如果注释这段代码，线程2将永远得不到执行机会
        t.o = new Object();

        t2.start();
    }
}

